package concurrency;

import java.util.concurrent.TimeUnit;

/**
 * 后台模式派生出的子线程
 *
 * 2018年 09月 23日 星期日
 * @author fireway
 */
class Daemon implements Runnable {
    private Thread[] mThreads = new Thread[10];

    public void run() {
        for(int i = 0; i < mThreads.length; i++) {
            mThreads[i] = new Thread(new DaemonSpawn(), "DaemonSpawn-" + i);
            mThreads[i].start();
        }

        // Daemon线程被设置成了后台模式，然后派生了许多子
        // 线程,这些线程并没有被显示地设置为后台模式，不过它们
        // 的确是后台线程
        for(int i = 0; i < mThreads.length; i++) {
            System.out.println(mThreads[i] + " isDaemon? " + mThreads[i].isDaemon());
        }

        // 接着Daemon线程就进入无限循环，并在循环里调用
        // yield()方法把控制权交给其他线程
        System.out.println(Thread.currentThread() + " then yield");
        while(true) {
            Thread.yield();
        }
    }
}

class DaemonSpawn implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread() + " then yield");
        while(true) {
            Thread.yield();
        }
    }
}

public class Daemons {
    public static void main(String[] args) {
        Thread d = new Thread(new Daemon(), "Daemon");
        d.setDaemon(true);
        d.start();

        // Allow the daemon threads to
        // finish their startup processes:
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
